import axios from 'axios'
import { message } from 'ant-design-vue'
import qs from 'qs';

// 创建axios实例
const service = axios.create({
  // baseURL: window.appConfig.apiUrl, // api 的 base_url
  // timeout: 20000, // 请求超时时间
  baseURL: import.meta.env.VITE_apiUrl,
})

// 全局loading计数器
let loadingCount = 0
// 请求队列 - 用于防止重复请求
const pendingRequests = new Map()

// 生成请求标识(根据请求方式 链接 参数生成标识)
const generateRequestKey = (config) => {
  const { method, url, params, data } = config
  return [
    method,
    url,
    qs.stringify(params),
    typeof data === 'object' ? qs.stringify(data) : data,
  ].join('&')
}

// 添加请求到队列
const addPendingRequest = (config) => {
  const requestKey = generateRequestKey(config)
  config.cancelToken =
    config.cancelToken ||
    new axios.CancelToken((cancel) => {
      if (!pendingRequests.has(requestKey)) {
        pendingRequests.set(requestKey, cancel)
      }
    })
}

// 从队列中移除请求
const removePendingRequest = (config) => {
  const requestKey = generateRequestKey(config)
  if (pendingRequests.has(requestKey)) {
    const cancel = pendingRequests.get(requestKey)
    cancel(`重复请求被取消: ${requestKey}`)
    pendingRequests.delete(requestKey)
  }
}

// 显示loading的函数（根据你的UI库调整）
const showLoading = () => {
  if (loadingCount === 0) {
    // // 创建loading实例
    // loadingInstance = ElLoading.service({
    //   lock: true,
    //   text: '加载中...',
    //   background: 'rgba(0, 0, 0, 0.1)'
    // });
  }
  loadingCount++
}

// 隐藏loading的函数
const hideLoading = () => {
  if (loadingCount <= 0) return
  loadingCount--
  if (loadingCount === 0) {
    // // 延迟隐藏，避免闪烁
    // setTimeout(() => {
    //   if (loadingCount === 0) {
    //     loadingInstance.close();
    //     loadingInstance = null;
    //   }
    // }, 300);
  }
}

// request拦截器
service.interceptors.request.use(
  (config) => {
    // 处理重复请求
    if (!config.allowDuplicate) {
      removePendingRequest(config)
      addPendingRequest(config)
    }
    // 排除不需要loading的请求
    if (!config.hideLoading) {
      showLoading()
    }
    const token = localStorage.getItem('token')
    if (token && (config.headers.Authorization = token)) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// response 拦截器
service.interceptors.response.use(
  (response) => {
    const res = response.data

    // 从队列中移除已完成请求
    if (!response.config.allowDuplicate) {
      removePendingRequest(response.config)
    }

    if (!response.config.hideLoading) {
      hideLoading()
    }

    if (res.code && res.code !== 200) {
      return Promise.reject('error')
    } else {
      return response.data
    }
  },
  (error) => {
    // 从队列中移除失败的请求
    if (error.config && !error.config.allowDuplicate) {
      removePendingRequest(error.config)
    }

    hideLoading()

    // 处理取消请求的错误
    if (axios.isCancel(error)) {
      console.warn('已取消重复请求:', error.message)
    } else {
      if (error?.response?.data?.message) {
        message.error(error.response.data.message, 5)
      } else {
        message.error(error.message, 5)
      }
    }

    return Promise.reject(error)
  }
)

export default service
